package com.lxl.model;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;

/**
 * 敌军子弹类
 * @author 刘星鹭
 * @Email liuxinglumail@163.com
 * @version 创建时间： 2014年11月4日 下午4:07:16
 */
public class EnemyBullet {
	/**
	 * 子弹直径
	 */
	public static int BULLET_DIAMETER = 10;
	/**
	 * 子弹颜色
	 */
	public static Color BULLET_COLOR = Color.RED;
	/**
	 * 子弹速度
	 */
	public static int BULLET_SPEED = 4;
	/**
	 * 子弹方向
	 */
	private Direction bulletDirection = Direction.STOP;
	/**
	 * 子弹左上角横坐标
	 */
	private int bulletX = 0;
	/**
	 * 子弹左上角纵坐标
	 */
	private int bulletY = 0;
	/**
	 * 子弹所在弹夹
	 */
	private ArrayList<EnemyBullet> thisBullets = new ArrayList<EnemyBullet>();
	/**
	 * 子弹是否存活
	 */
	private boolean alive = true;

	/**
	 * 无参构造方法
	 */
	public EnemyBullet() {

	}

	/**
	 * 带参构造方法
	 * @param bulletDirection 子弹方向
	 * @param bulletX 子弹横坐标
	 * @param bulletY 子弹纵坐标
	 */
	public EnemyBullet(Direction bulletDirection, int bulletX, int bulletY) {
		this.bulletDirection = bulletDirection;
		this.bulletX = bulletX;
		this.bulletY = bulletY;
	}

	/**
	 * 画子弹方法
	 * @param graphics 画笔
	 */
	public void paint(Graphics graphics) {
		// 如果死了就return
		if (!alive)
			return;
		// 移动子弹
		move();
		// 储存当前画笔颜色
		Color backGroundColor = graphics.getColor();
		// 改变当前画笔颜色为子弹颜色
		graphics.setColor(BULLET_COLOR);
		// 画出子弹
		graphics.fillOval(bulletX, bulletY, BULLET_DIAMETER, BULLET_DIAMETER);
		// 还原当前画笔颜色
		graphics.setColor(backGroundColor);
	}

	/**
	 * 移动子弹方法
	 */
	private void move() {
		// 如果死了就return
		if (!alive)
			return;
		// 上
		if (bulletDirection == Direction.UP) {
			bulletY -= BULLET_SPEED;
		}
		// 下
		else if (bulletDirection == Direction.DOWN) {
			bulletY += BULLET_SPEED;
		}
		// 左
		else if (bulletDirection == Direction.LEFT) {
			bulletX -= BULLET_SPEED;
		}
		// 右
		else if (bulletDirection == Direction.RIGHT) {
			bulletX += BULLET_SPEED;
		}
		// 上左
		else if (bulletDirection == Direction.UP_LEFT) {
			bulletX -= BULLET_SPEED * 0.7;
			bulletY -= BULLET_SPEED * 0.7;
		}
		// 上右
		else if (bulletDirection == Direction.UP_RIGHT) {
			bulletX += BULLET_SPEED * 0.7;
			bulletY -= BULLET_SPEED * 0.7;
		}
		// 下左
		else if (bulletDirection == Direction.DOWN_LEFT) {
			bulletX -= BULLET_SPEED * 0.7;
			bulletY += BULLET_SPEED * 0.7;
		}
		// 下右
		else if (bulletDirection == Direction.DOWN_RIGHT) {
			bulletX += BULLET_SPEED * 0.7;
			bulletY += BULLET_SPEED * 0.7;
		}
		// 如果子弹出界
		if (bulletX < 0 || bulletX > 800) {
			// 使其死去
			alive = false;
			// remove它
			thisBullets.remove(this);
		} else if (bulletY < 0 || bulletY > 600) {
			// 使其死去
			alive = false;
			// remove它
			thisBullets.remove(this);
		}
	}

	/**
	 * 判断子弹是否击中敌人
	 * @param myTank 我军坦克
	 */
	public void hit(MyTank myTank) {
		// 如果死了就return
		if (!alive)
			return;
		// 如果是死坦克就跳过
		if (!myTank.isAlive())
			return;
		// 如果碰撞了就把子弹和坦克都设为死亡
		if (myTank.getSurroundRectangle().intersects(getSurroundRectangle())) {
			alive = false;
			myTank.setAlive(false);
		}
	}

	/**
	 * 判断子弹是否击中墙
	 * @param wall 欲判断的墙
	 */
	public void hitWall(Wall wall) {
		// 如果死了就return
		if (!alive)
			return;
		// 如果击中了墙
		if (getSurroundRectangle().intersects(wall.getSurroundRectangle()))
			alive = false;
	}

	/**
	 * 获得围绕当前圆形的矩形
	 * @return 围绕当前圆形的矩形
	 */
	public Rectangle getSurroundRectangle() {
		return new Rectangle(bulletX, bulletY, BULLET_DIAMETER, BULLET_DIAMETER);
	}

	/**
	 * alive的setter
	 * @param alive 是否存活
	 */
	public void setAlive(boolean alive) {
		this.alive = alive;
	}
	/**
	 * alive的getter
	 * @return true则存活
	 */
	public boolean isAlive() {
		return alive;
	}

	/**
	 * thisBullets的setter
	 * @param thisBullets 当前子弹所属弹夹
	 */
	public void setThisBullets(ArrayList<EnemyBullet> thisBullets) {
		this.thisBullets = thisBullets;
	}
}
